home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 145
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z
/
Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin
/
tools
/
sharp
/
xc2103i.lzh
/
XC2103.XDF
/
ASK30
/
SAMPLE.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-09-15
|
5KB
|
314 lines
/*
** サンプルアクセサリ for ASK3
** Copyright (C) 1992 ACCESS CO.,LTD.
*/
#include "aci.h"
#include "askkey.h"
typedef unsigned char u_char;
short acc1_main(), acc2_main();
u_char cbuf[80];
MEAN kbuf[80];
MEAN mbuf[20];
ACC_DEF acc1 = {
KS_EDITING|KS_SELECT, /* invoke_stt */
NOT_ASCII|HELP_KEY, /* invoke_key */
acc1_main, /* acc_func */
{
cbuf, kbuf, mbuf
}
};
ACC_DEF acc2 = {
KS_EDIT0|KS_EDITING, /* invoke_stt */
('Q' - '@'), /* invoke_key */
acc2_main, /* acc_func */
{
cbuf, kbuf, mbuf
}
};
short acc1_main(code)
BIT16 code;
{
static u_char tmp[21];
u_char *ltohex(), *strcat();
u_char *p;
int i, l;
for (p = cbuf, i = 0; i < 20; i++) {
if (*p == '\0')
break;
tmp[i] = *p++;
}
tmp[l = i] = '\0';
cbuf[0] = '\0';
for (i = 0; i < l; i++) {
strcat(cbuf,ltohex((long)tmp[i]));
strcat(cbuf," ");
}
return(DF_OUTSTR|CACI_END);
}
u_char digit[15];
u_char *ltoa(l)
unsigned long l;
{
register int i;
digit[14] = '\0';
for (i = 13; i >= 0; i--) {
digit[i] = l % 10 + '0';
l /= 10;
}
for (i = 0; i < 13; i++) {
if (digit[i] != '0')
break;
}
return(&digit[i]);
}
u_char *ltohex(l)
unsigned long l;
{
register int i;
u_char c;
digit[14] = '\0';
for (i = 13; i > 5; i--) {
c = l & 0x0000000f;
if (c < 10)
c += '0';
else
c += 'A' - 10;
digit[i] = c;
l >>= 4;
}
for (i = 6; i < 13; i++) {
if (digit[i] != '0')
break;
}
return(&digit[i]);
}
short acc2_main(code)
BIT16 code;
{
static int first = 1;
static u_char display[20];
static unsigned long val;
static int mode;
static int hexmode = 0;
BIT16 nc, mask_key();
u_char *p, *strcpy();
int l, strlen();
if (first) {
first = 0;
mode = 0;
val = 0L;
goto disp;
}
nc = mask_key(code);
if (nc == '\r') {
strcpy(cbuf,hexmode ? ltohex(val) : ltoa(val));
mode = 1;
return(DF_OUTSTR|CACI_SUSPEND);
}
if (nc == (CTRL_ON|NOT_ASCII|XF1_KEY)) {
first = 1;
return(KEY_AGAIN|CACI_END);
} else if (nc == '\033') {
first = 1;
return(CACI_END);
}
if (nc & NOT_ASCII)
return(CACI_NORMAL);
nc &= 0xff;
if (nc >= 'a' && nc <= 'z')
nc -= 'a' - 'A';
if (nc == 'X') {
hexmode = 1 - hexmode;
mode = 1;
} else if (nc >= '0' && nc <= '9' || nc >= 'A' && nc <= 'F') {
if (nc >= 'A') {
if (!hexmode)
return(CACI_NORMAL);
nc -= 'A' - '0' - 10;
}
if (mode != 0) {
val = 0L;
mode = 0;
}
nc -= '0';
if (hexmode) {
val = (val << 4) | nc;
} else {
val = (val * 10) + nc;
}
}
disp:
strcpy(display,hexmode ? "Hex " : "Dec ");
strcat(display,"[");
p = hexmode ? ltohex(val) : ltoa(val);
l = 10 - strlen(p);
while (l-- > 0)
strcat(display," ");
strcat(display,p);
strcat(display,"]");
l = sstrtom(display,kbuf,0);
kbuf[l] = 0;
return(DF_KWINSTR|CACI_NORMAL);
}
BIT16 mask_key(code)
BIT16 code;
{
code &= (0xff|CTRL_ON|SHIFT_ON|NOT_ASCII);
if (!(code & NOT_ASCII))
code &= ~CTRL_ON;
return(code);
}
u_char *strcat(s1, s2)
u_char *s1, *s2;
{
u_char *ret = s1;
while (*s1)
s1++;
while (*s1++ = *s2++)
;
return(ret);
}
u_char *strcpy(s1, s2)
u_char *s1, *s2;
{
u_char *ret = s1;
while (*s1++ = *s2++)
;
return(ret);
}
int strlen(s)
u_char *s;
{
u_char *p = s;
while (*s)
s++;
return(s - p);
}
short brksts;
int sstrtom(str, buf, mode) /* FPコール62番 */
u_char *str; /* 8(a6) */
MEAN *buf; /* 12(a6) */
int mode; /* 16(a6) */
{
#asm
move.w #-1,-(sp)
.dc.w $ff33
addq.l #2,sp
move.w d0,_brksts
clr.w -(sp)
.dc.w $ff33
addq.l #2,sp
*
move.l 16(a6),-(sp)
move.l 12(a6),-(sp)
move.l 8(a6),-(sp)
move.l #62,-(sp)
.dc.w $ff22
lea.l 16(sp),sp
*
move.l d0,-(sp)
move.w _brksts,-(sp)
.dc.w $ff33
addq.l #2,sp
move.l (sp)+,d0
#endasm
}
/*[ここまで]CONの一部(スーパーバイザモードで動作する)
**[ここから]ユーザモード
*/
int askver() /* FPコール50番 */
{
#asm
move.l #50,-(sp)
.dc.w $ff22
addq.l #4,sp
#endasm
}
int acc_touroku(accdef) /* FPコール60番 */
ACC_DEF *accdef; /* 8(a6) */
{
#asm
move.l 8(a6),-(sp)
move.l #60,-(sp)
.dc.w $ff22
addq.l #8,sp
#endasm
}
int acc_delete(acc_handle) /* FPコール61番 */
int acc_handle;
{
#asm
move.l 8(a6),-(sp)
move.l #61,-(sp)
.dc.w $ff22
addq.l #8,sp
#endasm
}
#include <stdio.h>
#include <signal.h>
int ah1, ah2; /* アクセサリ・ハンドル */
void die()
{
/* アクセサリを削除する */
if (acc_delete(ah1) == 0)
printf("アクセサリ1を削除しました.\n");
if (acc_delete(ah2) == 0)
printf("アクセサリ2を削除しました.\n");
exit(1);
}
void main()
{
/* ASKのバージョンチェック */
if (askver() < 300) {
printf("ASKのバージョンが3以上ではありません.\n");
exit(1);
}
signal(SIGINT, die);
/* アクセサリを登録する */
if ((ah1 = acc_touroku(&acc1)) == -1)
printf("アクセサリ1を登録できません.\n");
else
printf("アクセサリ1を登録しました.\n");
if ((ah2 = acc_touroku(&acc2)) == -1)
printf("アクセサリ2を登録できません.\n");
else
printf("アクセサリ2を登録しました.\n");
/* アクセサリを試す */
while (getchar() != EOF)
;
die();
}